/*!
* \file WtSelTicker.h
* \project	WonderTrader
*
* \author Wesley
* \date 2020/03/30
*
* \brief SEL实时行情处理器头文件
* 
* 本文件定义了SEL实时行情处理器类，主要功能包括：
* - 选股策略实时行情数据接收和处理
* - 时间驱动的K线周期管理
* - 交易时段控制和时间同步
* - 分钟线闭合事件触发
* - 主力合约和次主力合约处理
* 
* WtSelRtTicker是SEL引擎的核心组件之一，专门为选股策略场景
* 设计，提供稳定的时间控制和事件响应机制。
*/
#pragma once

#include <stdint.h>
#include <atomic>

#include "../Includes/WTSMarcos.h"
#include "../Share/StdUtils.hpp"

NS_WTP_BEGIN
class WTSSessionInfo;
class IDataReader;
class WTSTickData;

class WtSelEngine;

/**
 * @class WtSelRtTicker
 * @brief SEL实时行情处理器类
 * 
 * SEL实时行情处理器是SEL引擎的核心时间驱动组件，主要功能包括：
 * 1. 选股策略实时行情数据处理：接收和转发实时tick数据
 * 2. 时间驱动管理：根据交易时段规则管理时间流
 * 3. K线周期控制：触发分钟线闭合事件
 * 4. 主力合约处理：自动处理主力和次主力合约切换
 * 5. 交易时段同步：确保引擎时间与市场时间同步
 * 6. 数据存储协调：与数据存储模块协调K线数据写入
 * 
 * 该类专门为选股策略场景设计，采用多线程设计，
 * 使用独立线程进行时间检查和事件触发，确保策略稳定运行。
 */
class WtSelRtTicker
{
public:
	/**
	 * @brief 构造函数
	 * @param engine SEL引擎指针
	 * 
	 * 初始化SEL实时行情处理器，设置引擎引用和初始状态
	 */
	WtSelRtTicker(WtSelEngine* engine);
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理资源，确保线程正常退出
	 */
	~WtSelRtTicker();

public:
	/**
	 * @brief 初始化行情处理器
	 * @param store 数据存储接口指针
	 * @param sessionID 交易时段ID
	 * 
	 * 设置数据存储接口和交易时段信息，准备开始处理行情数据
	 */
	void	init(IDataReader* store, const char* sessionID);
	
	/**
	 * @brief 处理实时行情数据
	 * @param curTick 当前tick数据
	 * @param hotFlag 热点标志(0-普通合约,1-主力合约,2-次主力合约)
	 * 
	 * 接收实时tick数据，进行时间驱动处理，触发相应的引擎事件
	 */
	void	on_tick(WTSTickData* curTick, uint32_t hotFlag = 0);

	/**
	 * @brief 启动行情处理器
	 * 
	 * 启动独立的时间检查线程，开始时间驱动处理
	 */
	void	run();
	
	/**
	 * @brief 停止行情处理器
	 * 
	 * 停止时间检查线程，结束行情处理
	 */
	void	stop();

private:
	/**
	 * @brief 触发价格事件
	 * @param curTick 当前tick数据
	 * @param hotFlag 热点标志
	 * 
	 * 将tick数据转发给SEL引擎，处理主力合约和次主力合约
	 */
	void	trigger_price(WTSTickData* curTick, uint32_t hotFlag = 0);

private:
	WTSSessionInfo*	_s_info;			///< 交易时段信息
	WtSelEngine*	_engine;			///< SEL引擎指针
	IDataReader*	_store;				///< 数据存储接口

	uint32_t	_date;					///< 当前日期
	uint32_t	_time;					///< 当前时间

	uint32_t	_cur_pos;				///< 当前分钟位置

	StdUniqueMutex	_mtx;				///< 互斥锁，保护共享数据
	std::atomic<uint64_t>	_next_check_time;	///< 下次检查时间(原子变量)
	std::atomic<uint32_t>	_last_emit_pos;		///< 最后发射位置(原子变量)

	bool			_stopped;			///< 停止标志
	StdThreadPtr	_thrd;				///< 时间检查线程
};

NS_WTP_END